package com.swlz.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import com.swlz.commons.DBUtil;
import com.swlz.dto.MallSearch;
import com.swlz.dto.UserSearch;
import com.swlz.dto.MallProductSearch;
import com.swlz.entity.MallProduct;
import com.swlz.vo.PageVO;
import com.swlz.vo.ProductVo;
import com.swlz.vo.UserVO;

import cn.hutool.core.util.StrUtil;

import cn.hutool.core.util.StrUtil;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import java.util.Date;
import java.util.HashMap;

import com.swlz.commons.DBUtil;
import com.swlz.dto.MallProductSearch;
import com.swlz.entity.MallProduct;
/**
 * <pre>
 * 数据访问对象
 * 商城产品
 * TableName : MALL_PRODUCT
 * ClassName : com.swlz.dao.MallProductDAO
 * Author : swlz
 * E-Mail : 2233875735@qq.com
 * Date : 2020-06-28 08:38:00
 * Version : 1.0
 * Copyright 2020 swlz.top Inc. All rights reserved. 
 * Warning: this content is only for internal circulation of the company. It is forbidden to divulge it or use it for other commercial purposes
 * </pre>
 **/
public class MallProductDAO {
	
	private static Logger log = LoggerFactory.getLogger(MallProductDAO.class);

	
	public long count(MallSearch search)throws SQLException {
		StringBuffer sql = new StringBuffer("SELECT count(*) as c FROM MALL_PRODUCT a INNER JOIN mall_type b ON a.MALL_TYPE_ID = b.MALL_TYPE_ID");
		List<Object> params = new ArrayList<Object>();
		where(search,sql,params);
		System.out.println("SQL:"+sql);//日志
		System.out.println("patams:"+params);
		return DBUtil.getLong(sql.toString(), params.toArray());
	}
	
	/**
	 * 添加一个商城产品
	 * 包含所有字段
	 * @param mallProduct - 实体对象
	 * @return - 影响行数
	 * @throws SQLException
	 */
	public int insert(MallProduct mallProduct) throws SQLException {
		if(mallProduct.getProductId()==null) {
			mallProduct.setProductId(DBUtil.nextId());
		}
		mallProduct.setCreateTime(new Date());
		mallProduct.setVersionNum(0);
		mallProduct.setSortNumber(0L);
		return DBUtil.insert(mallProduct);
	}
 
	
	/**
	 * 添加一个商城产品
	 * 只包含非null的字段
	 * @param mallProduct - 实体对象
	 * @return - 影响行数
	 * @throws SQLException
	 */
	public int insertSelective(MallProduct mallProduct) throws SQLException {
		if(mallProduct.getProductId()==null) {
			mallProduct.setProductId(DBUtil.nextId());
		}
		mallProduct.setCreateTime(new Date());
		mallProduct.setVersionNum(0);
		mallProduct.setSortNumber(0L);
		return DBUtil.insertSelective(mallProduct);
	}
	

	/**
	 * 根据主键更新一个商城产品
	 * 包含所有字段
	 * @param mallProduct - 实体对象
	 * @return - 影响行数
	 * @throws SQLException
	 */
	public int update(MallProduct mallProduct) throws SQLException {
		mallProduct.setUpdateTime(new Date());
		return DBUtil.update(mallProduct);
	}
	
	/**
	 * 根据主键更新一个商城产品
	 * 只包含非null的字段
	 * @param mallProduct - 实体对象
	 * @return - 影响行数
	 * @throws SQLException
	 */
	public int updateSelective(MallProduct mallProduct) throws SQLException {
		mallProduct.setUpdateTime(new Date());
		return DBUtil.updateSelective(mallProduct);
	}
	
	/**
	 * 根据主键删除一个商城产品
	 * @param productId - 主键
	 * @return
	 * @throws SQLException
	 */
	public int deleteById(Long productId) throws SQLException  {
		return DBUtil.execute("DELETE FROM MALL_PRODUCT WHERE PRODUCT_ID=?", productId);
	}
	
	/**
	 * 根据主键获取一个商城产品
	 * @param productId - 主键
	 * @return
	 * @throws SQLException 没有获取到，或者获取多个都会抛出异常
	 */
	public MallProduct selectById(Long productId) throws SQLException  {
		return DBUtil.get("SELECT * FROM MALL_PRODUCT WHERE PRODUCT_ID=?", MallProduct.class ,productId);
	}

		
	/**
	 * 根据模型中的非空字段查询
	 * @param productId - 实体对象
	 * @return
	 * @throws SQLException 没有获取到，或者获取多个都会抛出异常
	 */
	public MallProduct selectByModel(MallProduct mallProduct)throws SQLException {
		StringBuffer sql = new StringBuffer("SELECT * FROM MALL_PRODUCT WHERE 1=1 ");
		List<Object> params = new ArrayList<Object>();
		where(mallProduct,sql,params);
		return DBUtil.get(sql.toString(), MallProduct.class, params.toArray());
	}

	/**
	 * 根据模型中的非空字段查询
	 * @param productId - 实体对象
	 * @param index - 开始索引
	 * @param len - 返回长度
	 * @return
	 * @throws SQLException
	 */
	public List<MallProduct> selectByModel(MallProduct mallProduct,int index,int len)throws SQLException {
		StringBuffer sql = new StringBuffer("SELECT * FROM MALL_PRODUCT WHERE 1=1 ");
		List<Object> params = new ArrayList<Object>();
		where(mallProduct,sql,params);
		sql.append(" ORDER BY PRODUCT_ID DESC LIMIT ?,?");
		params.add(index);
		params.add(len);
		return DBUtil.list(sql.toString(), MallProduct.class, params.toArray());
	}

	/**
	 * 根据模型中的非空字段统计
	 * @param productId - 实体对象
	 * @return
	 * @throws SQLException
	 */
	public long countByModel(MallProduct mallProduct)throws SQLException {
		StringBuffer sql = new StringBuffer("SELECT count(*) as c FROM MALL_PRODUCT WHERE 1=1 ");
		List<Object> params = new ArrayList<Object>();
		where(mallProduct,sql,params);
		return DBUtil.getLong(sql.toString(), params.toArray());
	}
	
	/**
	 * 格式化where条件和参数
	 * @param productId - 实体对象
	 * @param sql - SQL语句
	 * @param params - SQL语句中的参数
	 */
	private void where(MallSearch mallSearch,StringBuffer sql,List<Object> params)throws SQLException {
		if(mallSearch.getMallTypeId()!=null){
			sql.append(" AND a.MALL_TYPE_ID=?");
			params.add(mallSearch.getMallTypeId());
		}
		if(!StrUtil.hasBlank(mallSearch.getKey())){
			sql.append(" and (a.PRODUCT_NAME like CONCAT('%',?,'%') or a.PRODUCT_COLORS like CONCAT('%',?,'%'))");
			params.add(mallSearch.getKey());
			params.add(mallSearch.getKey());
		}
	}
	
	private void where(MallProduct mallProduct,StringBuffer sql,List<Object> params) {
		if(mallProduct==null){
			return;
		}

		if(mallProduct.getProductId()!=null) {
			sql.append(" AND PRODUCT_ID=?");
			params.add(mallProduct.getProductId());
		}

		if(mallProduct.getMallTypeId()!=null) {
			sql.append(" AND MALL_TYPE_ID=?");
			params.add(mallProduct.getMallTypeId());
		}

		if(mallProduct.getProductName()!=null) {
			sql.append(" AND PRODUCT_NAME=?");
			params.add(mallProduct.getProductName());
		}

		if(mallProduct.getProductPrice1()!=null) {
			sql.append(" AND PRODUCT_PRICE_1=?");
			params.add(mallProduct.getProductPrice1());
		}

		if(mallProduct.getProductPrice2()!=null) {
			sql.append(" AND PRODUCT_PRICE_2=?");
			params.add(mallProduct.getProductPrice2());
		}

		if(mallProduct.getProductNum()!=null) {
			sql.append(" AND PRODUCT_NUM=?");
			params.add(mallProduct.getProductNum());
		}

		if(mallProduct.getProductColors()!=null) {
			sql.append(" AND PRODUCT_COLORS=?");
			params.add(mallProduct.getProductColors());
		}

		if(mallProduct.getProductImgs()!=null) {
			sql.append(" AND PRODUCT_IMGS=?");
			params.add(mallProduct.getProductImgs());
		}

		if(mallProduct.getProductContent()!=null) {
			sql.append(" AND PRODUCT_CONTENT=?");
			params.add(mallProduct.getProductContent());
		}

		if(mallProduct.getProductTime()!=null) {
			sql.append(" AND PRODUCT_TIME=?");
			params.add(mallProduct.getProductTime());
		}

		if(mallProduct.getProductOut()!=null) {
			sql.append(" AND PRODUCT_OUT=?");
			params.add(mallProduct.getProductOut());
		}

		if(mallProduct.getProductTags()!=null) {
			sql.append(" AND PRODUCT_TAGS=?");
			params.add(mallProduct.getProductTags());
		}

		if(mallProduct.getDeleted()!=null) {
			sql.append(" AND DELETED=?");
			params.add(mallProduct.getDeleted());
		}

		if(mallProduct.getDeleteUser()!=null) {
			sql.append(" AND DELETE_USER=?");
			params.add(mallProduct.getDeleteUser());
		}

		if(mallProduct.getDeleteTime()!=null) {
			sql.append(" AND DELETE_TIME=?");
			params.add(mallProduct.getDeleteTime());
		}

		if(mallProduct.getCreateUser()!=null) {
			sql.append(" AND CREATE_USER=?");
			params.add(mallProduct.getCreateUser());
		}

		if(mallProduct.getCreateTime()!=null) {
			sql.append(" AND CREATE_TIME=?");
			params.add(mallProduct.getCreateTime());
		}

		if(mallProduct.getVersionNum()!=null) {
			sql.append(" AND VERSION_NUM=?");
			params.add(mallProduct.getVersionNum());
		}

		if(mallProduct.getUpdateUser()!=null) {
			sql.append(" AND UPDATE_USER=?");
			params.add(mallProduct.getUpdateUser());
		}

		if(mallProduct.getUpdateTime()!=null) {
			sql.append(" AND UPDATE_TIME=?");
			params.add(mallProduct.getUpdateTime());
		}

		if(mallProduct.getSortNumber()!=null) {
			sql.append(" AND SORT_NUMBER=?");
			params.add(mallProduct.getSortNumber());
		}

	}
	
	public List<ProductVo> select(MallSearch search,int index,int len)throws SQLException {
		StringBuffer sql = new StringBuffer("SELECT a.*,b.MALL_TYPE_NAME FROM mall_product a INNER JOIN mall_type b ON a.MALL_TYPE_ID = b.MALL_TYPE_ID");
		List<Object> params = new ArrayList<Object>();
		where(search,sql,params);
		sql.append(" ORDER BY "+search.getSortName()+" "+search.getSortOrder()+" LIMIT ?,?");
		params.add(index);
		params.add(len);
		System.out.println("SQL:"+sql);//日志
		System.out.println("patams:"+params);
		return DBUtil.list(sql.toString(), ProductVo.class, params.toArray());
	}
	

//
//	 * 根据模型中的非空字段查询
//	 * @param productId - 实体对象
//	 * @param index - 开始索引
//	 * @param len - 返回长度
//	 * @return
//	 * @throws SQLException
//	 */
//	public List<MallProduct> selectByModel(MallProductSearch mallProduct)throws SQLException {
//		StringBuffer sql = new StringBuffer("SELECT * FROM MALL_PRODUCT WHERE 1=1 ");
//		List<Object> params = new ArrayList<Object>();
//		where(mallProduct,sql,params);
//		sql.append(" ORDER BY PRODUCT_ID DESC LIMIT ?,?");
//		params.add((mallProduct.getPageNumber()-1)*mallProduct.getPageSize());
//		params.add(mallProduct.getPageSize());
//		return DBUtil.list(sql.toString(), MallProduct.class, params.toArray());
//	}
//
//	/**
//	 * 根据模型中的非空字段统计
//	 * @param productId - 实体对象
//	 * @return
//	 * @throws SQLException
//	 */
//	public long countByModel(MallProductSearch mallProduct)throws SQLException {
//		StringBuffer sql = new StringBuffer("SELECT count(*) as c FROM MALL_PRODUCT WHERE 1=1 ");
//		List<Object> params = new ArrayList<Object>();
//		where(mallProduct,sql,params);
//		return DBUtil.getLong(sql.toString(), params.toArray());
//	}
//	
//	/**
//	 * 格式化where条件和参数
//	 * @param mallProduct - 实体对象
//	 * @param sql - SQL语句
//	 * @param params - SQL语句中的参数
//	 */
//	private void where(MallProductSearch mallProduct,StringBuffer sql,List<Object> params) {
//		if(mallProduct==null){
//			return;
//		}
//		if(mallProduct.getMallTypeId()!=null){
//			sql.append(" AND MALL_TYPE_ID=? ");
//			params.add(mallProduct.getMallTypeId());
//		}
//		if(mallProduct.getKey()!=null){
//			sql.append(" AND PRODUCT_NAME LIKE CONCAT('%',?,'%') ");
//			params.add(mallProduct.getKey());
//		}
//		
//	}
//	
//	public Map<Long, Float> selectPrice(List<Long> productIds)throws SQLException{
//		String ids = productIds.toString();
//		ids = ids.substring(1, ids.length()-1);
//		String sql = "SELECT PRODUCT_ID,PRODUCT_PRICE_2 from mall_product where product_id in("+ids+")";
//		log.debug(sql);
//		try(
//			Connection conn = DBUtil.getConnection();
//			PreparedStatement pstmt = conn.prepareStatement(sql);
//			ResultSet rs = pstmt.executeQuery();
//		){
//			Map<Long, Float> map = new HashMap<Long, Float>();
//			while(rs.next()){
//				map.put(rs.getLong(1), rs.getFloat(2));
//			}
//			return map;
//		}
//		
//	}


	/**
	 * 根据模型中的非空字段查询
	 * @param productId - 实体对象
	 * @param index - 开始索引
	 * @param len - 返回长度
	 * @return
	 * @throws SQLException
	 */
	public List<MallProduct> selectByModel(MallProductSearch mallProduct)throws SQLException {
		StringBuffer sql = new StringBuffer("SELECT * FROM MALL_PRODUCT WHERE 1=1 ");
		List<Object> params = new ArrayList<Object>();
		where(mallProduct,sql,params);
		sql.append(" ORDER BY PRODUCT_ID DESC LIMIT ?,?");
		params.add((mallProduct.getPageNumber()-1)*mallProduct.getPageSize());
		params.add(mallProduct.getPageSize());
		return DBUtil.list(sql.toString(), MallProduct.class, params.toArray());
	}

	/**
	 * 根据模型中的非空字段统计
	 * @param productId - 实体对象
	 * @return
	 * @throws SQLException
	 */
	public long countByModel(MallProductSearch mallProduct)throws SQLException {
		StringBuffer sql = new StringBuffer("SELECT count(*) as c FROM MALL_PRODUCT WHERE 1=1 ");
		List<Object> params = new ArrayList<Object>();
		where(mallProduct,sql,params);
		return DBUtil.getLong(sql.toString(), params.toArray());
	}
	
	/**
	 * 格式化where条件和参数
	 * @param mallProduct - 实体对象
	 * @param sql - SQL语句
	 * @param params - SQL语句中的参数
	 */
	private void where(MallProductSearch mallProduct,StringBuffer sql,List<Object> params) {
		if(mallProduct==null){
			return;
		}
		if(mallProduct.getMallTypeId()!=null){
			sql.append(" AND MALL_TYPE_ID=? ");
			params.add(mallProduct.getMallTypeId());
		}
		if(mallProduct.getKey()!=null){
			sql.append(" AND PRODUCT_NAME LIKE CONCAT('%',?,'%') ");
			params.add(mallProduct.getKey());
		}
		
	}
	
	public Map<Long, Float> selectPrice(List<Long> productIds)throws SQLException{
		String ids = productIds.toString();
		ids = ids.substring(1, ids.length()-1);
		String sql = "SELECT PRODUCT_ID,PRODUCT_PRICE_2 from mall_product where product_id in("+ids+")";
		log.debug(sql);
		try(
			Connection conn = DBUtil.getConnection();
			PreparedStatement pstmt = conn.prepareStatement(sql);
			ResultSet rs = pstmt.executeQuery();
		){
			Map<Long, Float> map = new HashMap<Long, Float>();
			while(rs.next()){
				map.put(rs.getLong(1), rs.getFloat(2));
			}
			return map;
		}
		
	}
}